//
// Created by PC on 2023/6/16.
/*
https://www.luogu.com.cn/record/113368798
GESP 2023.6 三级真题 编程第2题
T2密码合规检测
时间限制:1000MS内存限制:256MB分数:100
---- 描述
 网站注册需要有用户名和密码，编写程序以检查用户输入密码的有效性。
 合规的密码应满足以下要求:
 1.只能由a-z之间26个小写字母、A-Z之间26 个大写字母、0-9之间10个数字以及"!@#$"4个特殊字符构成。
 2.密码最短长度:6个字符，密码最大长度:12个字符
 3.大写字母、小写字母和数字必须至少有其中两种，以及至少有四个特殊字符中的一个。
----输入描述
 输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段，作为多组被检测密码。
----输出描述
 输出若干行，每行输出一组合规的密码。输出顺序以输入先后为序，即先输入则先输出
用例输入1
seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&YUhg@!
 用例输出 1
seHJ12!@
sjdkffH$123
 * */
// 完全不使用string内置函数的方法
// 通过测试


#include <iostream>

using namespace std;

int main()
{
//    string all="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
    string all = "abc!123,seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&YUhg@!,123abc,abc123()";
//    cin >> all;
    int n = 1; // 保存输入的密码数量
    // 获取字符串有几段
//    for (char a: all)
//    {
//        if (a == ',')
//            n++;
//    }
    int length=0;
    // 获取字符串长度length 以及 获取字符串分成几段n
    while(all[length])
    {
        if (all[length] == ',')
            n++;
        length++;
    }
    string strArr[n];
//    printf("length: %d\n",length);
//    string one="seHJ12!@";
// 以,为分割, 将字符串拆分, 存入数组中
    int k = 0;
    for (int j = 0; j < n; ++j)
    {
        for (; k < length; ++k)
        {
            {
                if (all[k] != ',')
                    strArr[j] += all[k];
                else
                {
                    ++k;
                    break;
                }
            }
        }
    }
    for (int i = 0; i < n; ++i)
    {
//        printf("%s\n", strArr[i].c_str());
    }
//    for (string one:strArr)
//  这两种写法都对, 但是按照clion的提示, 第二种方法更好, 因为one没有被修改, 所以使用const 引用比较安全
    for (const string &one:strArr)
    {

        bool special_char = false;
        //  这个数组保存是否有大写[0],小写[1],数字[2],有的话将相应的索引位置置1
        int big_small_digital[3] = {0};
        if (one.size() < 6 || one.size() > 12)
            continue;
        for (char c : one)
        {
            // 特殊字符必须有
            if (c == '!' || c == '@' || c == '#' || c == '$')
                special_char = true;
                // 大写, 小写, 数字 3选2
            else if (c >= 'a' && c <= 'z')
                big_small_digital[0] = 1;
            else if (c >= 'A' && c <= 'Z')
                big_small_digital[1] = 1;
            else if (c >= '0' && c <= '9')
                big_small_digital[2] = 1;
            else
            {
                // 不在以上范围内, 说明有超出范围的字符, 直接否决
                special_char = false;
                break;
            }
        }
        if ((big_small_digital[0] + big_small_digital[1] + big_small_digital[2]) < 2 || !special_char)
            continue;
        printf("%s\n", one.c_str());
    }
    return 0;
}